package com.calvin.study.singleton;

/**
 * 
 * @ClassName:LazySimpleSingleton
 * @Description:单例 - 懒汉式（简单），非线程安全。
 * 可通过添加synchronized关键字，使懒汉式变为线程安全。
 * @author:Calvin.W
 * @date:2021年12月6日 上午11:20:52
 */
public class LazySingleton {
	
	private LazySingleton() {
		//多线程下，构造方法执行多次 ，非线程安全
		System.out.println("我是构造方法LazySimpleSingleton()");
	}

	private static LazySingleton lazy = null;

	public static LazySingleton getInstance() {
		if (null == lazy) {
			lazy = new LazySingleton();
		}
		return lazy;
	}

	//private static volatile LazySingleton lazy = null;

	/**
	 * DCL（Double Check Lock双端检验所机制）
	 * 举例，停好车用车钥匙锁车门（第一次null==lazy）,为了确保没人能进来，我们在拉拉门，看是否能打开（第二次null==lazy)
	 * 但这种模式也有问题 CPU指令重排问题
	 */
	public static LazySingleton getInstanceDCL() {
		if (null == lazy) {
			//同步代码段
			synchronized (LazySingleton.class) {
				if(null == lazy) {
					lazy = new LazySingleton();
				}
			}
		}
		return lazy;
	}
}
